package com.bestcem.xm.user.util.business;

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.bestcem.xm.user.constant.ExcelConstant;
import com.bestcem.xm.user.handler.GroupIntroduceSheetHandler;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;

import java.util.ArrayList;
import java.util.List;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ExcelUtil {

    public static final String GROUP_INTRODUCE = "组织名称/组织编码/层级名称的修改规则：\n" +
            "- 组织名称必填，可以重复，但同父组织、同层级的组织，名称不能重复\n" +
            "- 组织编码非必填，为空时系统将自动生成新编码，并视为一个新组织\n" +
            "- 组织编码不能重复，不同编码视为不同组织\n" +
            "- 组织编码上传后不能修改\n" +
            "- 层级名称必填，不能重复，不同名称视为不同层级\n" +
            "- 根组织（即“全国”）有且只有一个\n" +
            "- 层级数必须大于等于2层，小于等于15层；节点总数不能超过5000\n" +
            "\n" +
            "数据更新规则：\n" +
            "- 组织编码同时存在于系统中和上传文件中，系统将更新组织，或恢复失效组织\n" +
            "- 组织编码仅存在于系统中，不存在上传文件中，组织将视为失效\n" +
            "- 编码仅存在于上传文件中，不存在系统中，系统将视为一个新组织\n" +
            "- 层级名称的更新规则同上\n" +
            "- 层级组织树的顺序和结构，以上传文件为准\n" +
            "\n" +
            "表格填写规则：\n" +
            "- 表头中标*的为必填项\n" +
            "- 请不要修改首页工作表名称\n" +
            "- 编辑好所有工作表后，请对比检查首页工作表与其他工作表，保持信息一致（包括文案和顺序）";

    public static void buildGroupIntroduceSheet(ExcelWriter excelWriter ) {
        // 设置填写须知
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
        // 设置字体
        headWriteCellStyle.setWriteFont(buildWriteFont());
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 背景绿色
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
        // 设置字体
        contentWriteCellStyle.setWriteFont(buildWriteFont());

        //设置 自动换行
        contentWriteCellStyle.setWrapped(true);

        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);

        WriteSheet sheet = EasyExcelFactory
                .writerSheet(0, ExcelConstant.USER_GROUP_EXCEL_INTRODUCE_SHEET)
                .registerWriteHandler(horizontalCellStyleStrategy)
                .registerWriteHandler(new GroupIntroduceSheetHandler())
                .build();
        List<List<String>> rows = new ArrayList<>();
        List<String> rowDatas = new ArrayList<>();
        rowDatas.add(GROUP_INTRODUCE);
        rows.add(rowDatas);
        excelWriter.write(rows, sheet);
    }

    public static HorizontalCellStyleStrategy buildGroupStrategy() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        // 设置字体
        headWriteCellStyle.setWriteFont(buildWriteFont());
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);

        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 设置字体
        contentWriteCellStyle.setWriteFont(buildWriteFont());

        // 设置 自动换行
        contentWriteCellStyle.setWrapped(true);

        // 设置边框样式
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);

        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }

    public static WriteFont buildWriteFont() {
        // 字体策略
        WriteFont headWriteFont = new WriteFont();
        // 字体
        headWriteFont.setFontName("微软雅黑");
        // 字体大小
        headWriteFont.setFontHeightInPoints((short) 11);
        return headWriteFont;
    }
}
